This file contains statistics and figures from the paper, “Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.

The paper can be found here:

Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution



Co-expression of chemosensory receptors

Percent of all read counts from a receptor gene, number of receptor species present per cell, and total counts from vomeronasal receptors, separated by cell type

Shannon Indices showing the specificity of receptor expression. High values indicate more co-expression

Proportions of first, second, and third most expressed receptor gene as percent of total receptor counts, separated by cell type

Prevalence and level of receptor co-expression by age and cell-type for the V1R and V2R lineages, respectively

Circos plot of genomic loci for significantly co-expressed receptor pairs in the V1R, V2R, and across-type populations

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSA1IgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKPlRoaXMgZmlsZSBjb250YWlucyBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIGZyb20gdGhlIHBhcGVyLCAiTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uIiBieSBNYXggSGlsbHMgSnIuLCBMaW1laSBNYSwgQWkgRmFuZywgVGhlbG1hIENoaXJlbWJhLCBTZXRoIE1hbGxveSwgQWxsaXNvbiBTY290dCwgQW5vamEgUGVyZXJhLCBhbmQgQy4gUm9uIFl1LiAgICAKClRoZSBwYXBlciBjYW4gYmUgZm91bmQgaGVyZTogIAoKW01vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbl0oaHR0cHM6Ly9lbGlmZXNjaWVuY2VzLm9yZy9yZXZpZXdlZC1wcmVwcmludHMvOTczNTYjdGFiLWNvbnRlbnQpCgoqKiogIAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgojIFItTWFya2Rvd24gR2xvYmFsIFNldHRpbmdzICAKCiMgU2V0LXVwIGEgZGVmYXVsdCBpbWFnZSBzaXplIG9mIDEwIFggMTAgaW5jaGVzLiBTdXBwcmVzcyB3YXJuaW5nCiMgYW5kIGVycm9yIG1lc3NhZ2VzLiBIaWRlIGNvZGUuCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjb21tZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgY2FjaGU9RkFMU0UpCgpgYGAKCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0KCiMgTGlicmFyeSBMb2FkaW5nICAKCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShraXQpOyBsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoc3RyaW5ncik7IGxpYnJhcnkocGxvdDNEKSAKICBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRhdGEudGFibGUpOyBsaWJyYXJ5KG9yZy5NbS5lZy5kYikKICBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShTZXVyYXQpOyBsaWJyYXJ5KERCSSk7IGxpYnJhcnkoY293cGxvdCkKICBsaWJyYXJ5KE1hdHJpeCk7IGxpYnJhcnkoZ2xtR2FtUG9pKTsgbGlicmFyeShjaXJjbGl6ZSkKICBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZ2dwdWJyKTsgbGlicmFyeShzdmdsaXRlKTsgbGlicmFyeShnZ3NpZ25pZikKICBsaWJyYXJ5KHN0YXRzKTsgbGlicmFyeSh2ZWdhbik7IGxpYnJhcnkoc2NhbGVzKTsgbGlicmFyeShjYXJldCkKICBsaWJyYXJ5KHBhdGNod29yayk7IGxpYnJhcnkocGxvdGx5KTsgbGlicmFyeShnZW9tdGV4dHBhdGgpCiAgbGlicmFyeShvcGVueGxzeCk7IGxpYnJhcnkoZ3JpZEV4dHJhKTsgbGlicmFyeShnZ3JlcGVsKQogIGxpYnJhcnkoR2VuZU92ZXJsYXApOyBsaWJyYXJ5KGJpb21hUnQpOyBsaWJyYXJ5KGdncG9pbnRkZW5zaXR5KQogIGxpYnJhcnkoc2xpbmdzaG90KTsgbGlicmFyeSh0cmFkZVNlcSk7IGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeSh2aXJpZGlzKTsgbGlicmFyeShVcFNldFIpOyBsaWJyYXJ5KHBoZWF0bWFwKTsgbGlicmFyeShtc2lnZGJyKQogIGxpYnJhcnkoZmdzZWEpOyBsaWJyYXJ5KGdyaWQpOyBsaWJyYXJ5KElEUG1pc2MpOyBsaWJyYXJ5KE1BU1MpCiAgbGlicmFyeShSbWlzYyk7IGxpYnJhcnkoZ2dwbG90aWZ5KTsgbGlicmFyeShnZ3BtaXNjKTsgbGlicmFyeShzY2FsZXMpCiAgbGlicmFyeShoZWF0bWFwbHkpOyBsaWJyYXJ5KGRlbmRleHRlbmQpCn0pCgpgYGAKCmBgYHtyfQoKIyBHbG9iYWwgVmFyaWFibGVzCgojIFRoZSBob21lIGRpcmVjdG9yeQpob21lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL3NjX1ZOTy8iCiMgRGlyZWN0b3J5IGZvciBzdG9yaW5nIGRhdGEgb2JqZWN0cyBhdCBjcnVjaWFsIHN0YWdlcwpvYmplY3RfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWwuc2V1Lm9ianMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmcm9tIHRoZSBmaW5hbCBhbmFseXNpcwppbWFnZV9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbF9pbWFnZXMvIikKYWRvYmVfaW1hZ2VzIDwtIHBhc3RlMChpbWFnZV9kaXIsICJhZG9iZV9pbGx1c3RyYXRvcl9zdmdfZmlsZXMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmb3IgdGhlIGZpbmFsIHBhcGVyCmNsdXN0cmVlX2RpciA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCJjbHVzdHJlZS8iKQojIEEgZGlyZWN0b3J5IGZvciBUcmFkZVNlcSBmaXRHQU0gb3V0cHV0CmZpdEdBTV9kaXIgPC0gcGFzdGUwKG9iamVjdF9kaXIsICJmaXRHQU0vIikKbW9lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL21vbG5nXzI0MDdfMjQ1My9SX29iai8iCgojIE9QRU4gYGBgdm5vLnNldS5pbnRlZ3JhdGVkYGBgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ2bm8uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCiNMb2FkIE5ldXJvbmFsIExpbmVhZ2UgU2V1cmF0IE9iamVjdCAgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJuZXVyb24uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCgojIFJlbmFtZSB1bmtub3duX21WU04gdG8gc1ZTTgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKCiMgR2V0IGNvbG9yIHNjaGVtZSBmb3IgdGhlIHdob2xlIHZubyBkYXRhc2V0CnZuby5jZWxsX3R5cGUuY29sb3JzIDwtIGh1ZV9wYWwoKShsZW5ndGgobGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpKSkKbmFtZXModm5vLmNlbGxfdHlwZS5jb2xvcnMpIDwtIGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KQoKIyBLZWVwIG5ldXJvbiBkYXRhc2V0IGNvbG9yIHNjaGVtZSBjb25zaXN0ZW50IHdpdGggdGhlIHdob2xlIHZubyBjb2xvciBzY2hlbWUsIHdoZXJlIHBvc3NpYmxlICAKbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gdm5vLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiwiVjFSX2lWU04iLCJWMlJfaVZTTiIsIkdCQyIpXQpuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSBzZXROYW1lcyhjKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzLCIjMDBCMEY2IiwiIzk1OTBGRiIsIiNFNzZCRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhuYW1lcyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycyksImlPU04iLCJsYXRlX0lOUCIsImVhcmx5X0lOUCIpKQoKbWF0dXJlLm5ldXJvbnMgPC0gc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKbWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMgPC0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIildCgpnbG9iYWwudmFycyA8LSBjKGxzKCksImdsb2JhbC52YXJzIikKCmBgYAoKKioqICAKCiMgQ28tZXhwcmVzc2lvbiBvZiBjaGVtb3NlbnNvcnkgcmVjZXB0b3JzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCmBgYHtyfQoKbXlfdGhlbWVfMyA8LSB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiB5IGF4aXMgbGFiZWwKICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4IGF4aXMgbGFiZWwKICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE2LGhqdXN0PTAuNSxmYWNlPSdib2xkJyksICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBwbG90IHRpdGxlLCBjZW50ZXIKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBsZWdlbmQgdGl0bGUKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksICAgICAgICAgICAgICAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBsZWdlbmQgdGV4dAogICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTEyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIGF4aXMgdGljayBsYWJlbHMKICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4LWF4aXMgdGljayBsYWJlbHMKICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4LWF4aXMgdGlja3MKICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemU9dW5pdCg4LCdtbScpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGhlIHNpemUgb2YgbGVnZW5kICdib3hlcycKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUuYWxpZ249MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbGVmdCBhbGlnbiBsZWdlbmQgdGl0bGUKICAgICAgICAgICAgICAgICAgICBhc3BlY3QucmF0aW89MSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAja2VlcCBwbG90cyBzcXVhcmUKCmBgYAoKYGBge3J9CgptZXRhZGF0YS5jb21wYXJlIDwtIEZldGNoRGF0YShtYXR1cmUubmV1cm9ucyx2YXJzPWMoImNlbGxfdHlwZSIsInBlcmNlbnQucmVjZXB0b3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlcHRvci5zcGVjaWVzIiwidG90YWwucmVjZXB0b3IuY250IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdC5yZWNlcHRvci5wZXJjZW50Iiwic2Vjb25kLnJlY2VwdG9yLnBlcmNlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXJkLnJlY2VwdG9yLnBlcmNlbnQiLCJmaXJzdC5yZWNlcHRvci5jb3VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kLnJlY2VwdG9yLmNvdW50IiwidGhpcmQucmVjZXB0b3IuY291bnQiKSkKCmBgYAoKYGBge3J9CgpyZWNlcHRvci5wZXJjZW50LmRmIDwtIAogIHBpdm90X2xvbmdlcihkYXRhPW1ldGFkYXRhLmNvbXBhcmVbICxjKDEsNTo3KV0sCiAgICAgICAgICAgICAgIGNvbHM9ZW5kc193aXRoKCJwZXJjZW50IiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvPSJyZWNlcHRvciIsCiAgICAgICAgICAgICAgIG5hbWVzX3BhdHRlcm49IiguKilcXC5yZWNlcHRvclxcLnBlcmNlbnQiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG89InBlcmNlbnQiKQoKYGBgCgojIyBQZXJjZW50IG9mIGFsbCByZWFkIGNvdW50cyBmcm9tIGEgcmVjZXB0b3IgZ2VuZSwgbnVtYmVyIG9mIHJlY2VwdG9yIHNwZWNpZXMgcHJlc2VudCBwZXIgY2VsbCwgYW5kIHRvdGFsIGNvdW50cyBmcm9tIHZvbWVyb25hc2FsIHJlY2VwdG9ycywgc2VwYXJhdGVkIGJ5IGNlbGwgdHlwZSAgCgpgYGB7cixmaWcud2lkdGg9MTgsZmlnLmhlaWdodD02fQoKbXlfY29tcGFyaXNvbnMgPC0gbGlzdChjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiksYygiVjJSX21WU04iLCJtT1NOIiksYygibU9TTiIsInNWU04iKSwKICAgICAgICAgICAgICAgICAgICAgIGMoIlYxUl9tVlNOIiwibU9TTiIpLGMoIlYyUl9tVlNOIiwic1ZTTiIpLGMoIlYxUl9tVlNOIiwic1ZTTiIpKQoKZmlnU182QSA8LSBnZ3Bsb3QobWV0YWRhdGEuY29tcGFyZSxhZXMoeD1jZWxsX3R5cGUseT1wZXJjZW50LnJlY2VwdG9ycyxmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1tYXR1cmUuY2VsbF90eXBlLmNvbG9ycykgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTEwLGNvbG91cj0iYmxhY2siLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnM9bXlfY29tcGFyaXNvbnMsdGlwLmxlbmd0aD0wLjAxLAogICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIGdndGl0bGUoInBlcmNlbnQucmVjZXB0b3JzIikgKyB5bGFiKCJyZWNlcHRvci90b3RhbCAoJSkiKSArIG15X3RoZW1lXzMgKyBzY2FsZV95X2xvZzEwKCkKZmlnU182QiA8LSBnZ3Bsb3QobWV0YWRhdGEuY29tcGFyZSxhZXMoeD1jZWxsX3R5cGUseT1yZWNlcHRvci5zcGVjaWVzLGZpbGw9Y2VsbF90eXBlKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoIkNlbGwgVHlwZSIsdmFsdWVzPW1hdHVyZS5jZWxsX3R5cGUuY29sb3JzKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sZ2VvbT0ncG9pbnQnLHNpemU9MTAsY29sb3VyPSJibGFjayIsc2hhcGU9OTUsc2hvd19ndWlkZT1GQUxTRSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucyx0aXAubGVuZ3RoPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0id2lsY294LnRlc3QiLGxhYmVsPSJwLnNpZ25pZiIsdmp1c3Q9MC4zKSArCiAgZ2d0aXRsZSgicmVjZXB0b3Iuc3BlY2llcyIpICsgeWxhYigibnVtYmVyIG9mIHJlY2VwdG9yIHNwZWNpZXMvY2VsbCIpICsgbXlfdGhlbWVfMyArIHNjYWxlX3lfbG9nMTAoKQpmaWdTXzZDIDwtIGdncGxvdChtZXRhZGF0YS5jb21wYXJlLGFlcyh4PWNlbGxfdHlwZSx5PXRvdGFsLnJlY2VwdG9yLmNudCxmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1tYXR1cmUuY2VsbF90eXBlLmNvbG9ycykgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTEwLGNvbG91cj0iYmxhY2siLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnM9bXlfY29tcGFyaXNvbnMsdGlwLmxlbmd0aD0wLjAxLAogICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIGdndGl0bGUoInRvdGFsLnJlY2VwdG9yLmNudCIpICsgeWxhYigidG90YWwgbm9ybWFsaXplZCBjb3VudCIpICsgbXlfdGhlbWVfMyArIHNjYWxlX3lfbG9nMTAoKQoKZ2dhcnJhbmdlKGZpZ1NfNkEsZmlnU182QixmaWdTXzZDLG5jb2w9Myxucm93PTEsY29tbW9uLmxlZ2VuZD1UUlVFLGFsaWduPSJodiIsbGVnZW5kPSJib3R0b20iKQogIApgYGAKCiMjIFNoYW5ub24gSW5kaWNlcyBzaG93aW5nIHRoZSBzcGVjaWZpY2l0eSBvZiByZWNlcHRvciBleHByZXNzaW9uLiBIaWdoIHZhbHVlcyBpbmRpY2F0ZSBtb3JlIGNvLWV4cHJlc3Npb24gIAoKYGBge3J9CgphbHBoYS5kaXZlcnNpdHkuZGYgPC0gRmV0Y2hEYXRhKG5ldXJvbi5pbnRlZ3JhdGVkLHZhcnM9YygiYWdlIiwiY2VsbF90eXBlIiwiU2hhbm5vbi5JbmRleCIpKQoKYGBgCgpgYGB7cn0KCmZpZzVfYSA8LSBnZ3Bsb3QoYWxwaGEuZGl2ZXJzaXR5LmRmLGFlcyh4PWNlbGxfdHlwZSx5PVNoYW5ub24uSW5kZXgsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpICsgI3RoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTEwLGNvbG91cj0id2hpdGUiLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBmYWNldF9ncmlkKC4gfiBhZ2UpICsKICAjIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1hbHBoYV9jb21wYXJpc29ucy5saXN0LHRpcC5sZW5ndGg9MC4wMSwKICAjICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIHlsYWIoIlNoYW5ub24gSW5kZXgiKSArIHhsYWIoIkNlbGwgVHlwZSIpICsgdGhlbWVfYncoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTIsIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MzIsZmFjZT0iYm9sZCIpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSx2anVzdD0xLGhqdXN0PTEpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjQpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpKSArIAogIE5vTGVnZW5kKCkgCgpmaWc1X2EKCmBgYAoKIyMgUHJvcG9ydGlvbnMgb2YgZmlyc3QsIHNlY29uZCwgYW5kIHRoaXJkIG1vc3QgZXhwcmVzc2VkIHJlY2VwdG9yIGdlbmUgYXMgcGVyY2VudCBvZiB0b3RhbCByZWNlcHRvciBjb3VudHMsIHNlcGFyYXRlZCBieSBjZWxsIHR5cGUgIAoKYGBge3IsZmlnLndpZHRoPTE4LGZpZy5oZWlnaHQ9Nn0KCmZpZ1NfNi5wYXJ0XzIgPC0gZ2dwbG90KGRhdGE9cmVjZXB0b3IucGVyY2VudC5kZixhZXMoeCA9IHJlY2VwdG9yLCB5ID0gcGVyY2VudCwgZmlsbCA9IHJlY2VwdG9yKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogICAgZmFjZXRfZ3JpZCh+IGNlbGxfdHlwZSkgKyBteV90aGVtZV8zICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xNikpIAoKZmlnU182LnBhcnRfMgoKYGBgCgojIyBQcmV2YWxlbmNlIGFuZCBsZXZlbCBvZiByZWNlcHRvciBjby1leHByZXNzaW9uIGJ5IGFnZSBhbmQgY2VsbC10eXBlIGZvciB0aGUgVjFSIGFuZCBWMlIgbGluZWFnZXMsIHJlc3BlY3RpdmVseSAgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCnJlY2VwdG9yLm1ldGFkYXRhIDwtIEZldGNoRGF0YShuZXVyb24uaW50ZWdyYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnM9YygiY2VsbF90eXBlIiwiYWdlIiwiZmlyc3QucmVjZXB0b3IuY291bnQiLCJyZWNlcHRvci5zcGVjaWVzIikpCgpgYGAKCmBgYHtyfQoKVjFSLnJlY2VwdG9yLm1ldGFkYXRhIDwtIHJlY2VwdG9yLm1ldGFkYXRhW3JlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSAlaW4lIGMoImxhdGVfSU5QIiwiVjFSX2lWU04iLCJWMVJfbVZTTiIpLCBdCgpgYGAKCmBgYHtyLGluY2x1ZGU9RkFMU0V9CgojIyMjIyBWMVIgIyMjIyMKIyBHcm91cCBkYXRhIGJ5IGFnZS9jZWxsX3R5cGUgY29tYmluYXRpb25zLCBhbmQgaG93IG1hbnkgTiBjZWxscyAKVjFSLmNvX2V4cC5jZWxsX3R5cGUgPC0gCiAgIHN1bW1hcnlTRShWMVIucmVjZXB0b3IubWV0YWRhdGEsIAogICAgICAgICAgICAgbWVhc3VyZXZhciA9ICJmaXJzdC5yZWNlcHRvci5jb3VudCIsIAogICAgICAgICAgICAgZ3JvdXB2YXJzID0gYygiYWdlIiwiY2VsbF90eXBlIikpCgpWMVIuY29fZXhwLmNlbGxfdHlwZSROb25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAwLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkT25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAxLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkVHdvIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAyLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkVGhyZWVfb3JfbW9yZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYxUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYxUi5yZWNlcHRvci5tZXRhZGF0YVtWMVIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPj0gMywgXSkvVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKCmBgYAoKYGBge3IsaW5jbHVkZT1GQUxTRX0KClYxUi5wbG90LmRmIDwtIFYxUi5jb19leHAuY2VsbF90eXBlICU+JSBnYXRoZXIoUmVjZXB0b3JzLCBSYXRpbywgYygiVGhyZWVfb3JfbW9yZSIsIlR3byIsIk9uZSIsIk5vbmUiKSkKCmBgYAoKYGBge3IsaW5jbHVkZT1GQUxTRX0KCiMjIE9yZGVyIHRoZSBmYWN0b3JzIGFuZCByb3VuZCB0aGUgZmxvYXRzIGluIHRoZSBERiAgCiMjIyMjIFYxUiAjIyMjIwojIE9yZGVyIHRoZSBSZWNlcHRvcnMgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjFSLnBsb3QuZGYkUmVjZXB0b3JzIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMVIucGxvdC5kZiRSZWNlcHRvcnMpLCAKICAgICAgICAgbGV2ZWxzID0gYygiVGhyZWVfb3JfbW9yZSIsIlR3byIsIk9uZSIsIk5vbmUiKSkKCiMgT3JkZXIgdGhlIGFnZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMVIucGxvdC5kZiRhZ2UgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYxUi5wbG90LmRmJGFnZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJQMTQiLCJQNTYiKSkKCiMgT3JkZXIgdGhlIGNlbGxfdHlwZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMVIucGxvdC5kZiRjZWxsX3R5cGUgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYxUi5wbG90LmRmJGNlbGxfdHlwZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJsYXRlX0lOUCIsIlYxUl9pVlNOIiwiVjFSX21WU04iKSkKCiMgUm91bmQgdGhlIHJhdGlvIHRvIDQgZGlnaXRzClYxUi5wbG90LmRmJFJhdGlvIDwtIHJvdW5kKFYxUi5wbG90LmRmJFJhdGlvLCBkaWdpdHMgPSA0KQoKYGBgCgpgYGB7cn0KCmZpZzVfYiA8LSBnZ3Bsb3QoVjFSLnBsb3QuZGYsIGFlcyh4ID0gYWdlLCB5ID0gUmF0aW8sIGZpbGwgPSBSZWNlcHRvcnMsIGxhYmVsID0gUmF0aW8pKSArIAogIGdlb21fY29sKCkgKyB0aGVtZShhc3BlY3QucmF0aW89Myx0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTI0KSxsZWdlbmQucG9zaXRpb249InRvcCIpICsKICBmYWNldF9ncmlkKC4gfiBjZWxsX3R5cGUpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMVIucGxvdC5kZiwgUmF0aW8gPiAwKSwgc2l6ZT01LCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMVIucGxvdC5kZiwgUmVjZXB0b3JzID09ICJOb25lIiksIHNpemU9NSwgYWVzKHg9YWdlLCB5PS0wLjAxLCBsYWJlbD1wYXN0ZTAoIk49IixOKSkpCgpmaWc1X2IKCmBgYAoKYGBge3J9CgpWMlIucmVjZXB0b3IubWV0YWRhdGEgPC0gcmVjZXB0b3IubWV0YWRhdGFbcmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlICVpbiUgYygibGF0ZV9JTlAiLCJWMlJfaVZTTiIsIlYyUl9tVlNOIiksIF0KCmBgYAoKYGBge3J9CgojIyMjIyBWMlIgIyMjIyMKClYyUi5jb19leHAuY2VsbF90eXBlIDwtIAogICBzdW1tYXJ5U0UoVjJSLnJlY2VwdG9yLm1ldGFkYXRhLCAKICAgICAgICAgICAgIG1lYXN1cmV2YXIgPSAiZmlyc3QucmVjZXB0b3IuY291bnQiLCAKICAgICAgICAgICAgIGdyb3VwdmFycyA9IGMoImFnZSIsImNlbGxfdHlwZSIpKQoKVjJSLmNvX2V4cC5jZWxsX3R5cGUkTm9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMCwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJE9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMSwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJFR3byA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMiwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJFRocmVlX29yX21vcmUgPC0gdW5saXN0KGxhcHBseShyb3duYW1lcyhWMlIuY29fZXhwLmNlbGxfdHlwZSksIGZ1bmN0aW9uKGkpewogICBhZ2UgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImFnZSJdCiAgIGNlbGxfdHlwZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiY2VsbF90eXBlIl0KICAgbnJvdyhWMlIucmVjZXB0b3IubWV0YWRhdGFbVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGFnZSA9PSBhZ2UgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyUi5yZWNlcHRvci5tZXRhZGF0YSRjZWxsX3R5cGUgPT0gY2VsbF90eXBlICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyUi5yZWNlcHRvci5tZXRhZGF0YSRyZWNlcHRvci5zcGVjaWVzID49IDMsIF0pL1YyUi5jb19leHAuY2VsbF90eXBlW2ksICJOIl0KfSkpCgpgYGAKCmBgYHtyfQoKVjJSLnBsb3QuZGYgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGUgJT4lIGdhdGhlcihSZWNlcHRvcnMsIFJhdGlvLCBjKCJUaHJlZV9vcl9tb3JlIiwiVHdvIiwiT25lIiwiTm9uZSIpKQoKYGBgCgpgYGB7cn0KCiMjIyMjIFYyUiAjIyMjIwoKIyBPcmRlciB0aGUgUmVjZXB0b3JzIGZhY3RvciBsZXZlbHMgZm9yIHBsb3R0aW5nClYyUi5wbG90LmRmJFJlY2VwdG9ycyA8LQogIGZhY3Rvcihhcy5mYWN0b3IoVjJSLnBsb3QuZGYkUmVjZXB0b3JzKSwgCiAgICAgICAgIGxldmVscyA9IGMoIlRocmVlX29yX21vcmUiLCJUd28iLCJPbmUiLCJOb25lIikpCgojIE9yZGVyIHRoZSBhZ2UgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjJSLnBsb3QuZGYkYWdlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMlIucGxvdC5kZiRhZ2UpLCAKICAgICAgICAgbGV2ZWxzID0gYygiUDE0IiwiUDU2IikpCgojIE9yZGVyIHRoZSBjZWxsX3R5cGUgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjJSLnBsb3QuZGYkY2VsbF90eXBlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMlIucGxvdC5kZiRjZWxsX3R5cGUpLCAKICAgICAgICAgbGV2ZWxzID0gYygiZWFybHlfSU5QIiwibGF0ZV9JTlAiLCJWMlJfaVZTTiIsIlYyUl9tVlNOIikpCgojIFJvdW5kIHRoZSByYXRpbyB0byA0IGRpZ2l0cwpWMlIucGxvdC5kZiRSYXRpbyA8LSByb3VuZChWMlIucGxvdC5kZiRSYXRpbywgZGlnaXRzID0gNCkKCmBgYAoKYGBge3J9CgpmaWc1X2MgPC0gZ2dwbG90KFYyUi5wbG90LmRmLCBhZXMoeCA9IGFnZSwgeSA9IFJhdGlvLCBmaWxsID0gUmVjZXB0b3JzLCBsYWJlbCA9IFJhdGlvKSkgKwogIGdlb21fY29sKCkgKyB0aGVtZShhc3BlY3QucmF0aW89Myx0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTI0KSxsZWdlbmQucG9zaXRpb249InRvcCIpICsKICBmYWNldF9ncmlkKC4gfiBjZWxsX3R5cGUpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMlIucGxvdC5kZiwgUmF0aW8gPiAwKSwgc2l6ZT01LCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKwogIGdlb21fdGV4dChkYXRhID0gc3Vic2V0KFYyUi5wbG90LmRmLCBSZWNlcHRvcnMgPT0gIk5vbmUiKSwgc2l6ZT01LCBhZXMoeD1hZ2UsIHk9LTAuMDEsIGxhYmVsPXBhc3RlMCgiTj0iLE4pKSkKCmZpZzVfYwoKYGBgCgojIyBDaXJjb3MgcGxvdCBvZiBnZW5vbWljIGxvY2kgZm9yIHNpZ25pZmljYW50bHkgY28tZXhwcmVzc2VkIHJlY2VwdG9yIHBhaXJzIGluIHRoZSBWMVIsIFYyUiwgYW5kIGFjcm9zcy10eXBlIHBvcHVsYXRpb25zICAKCmBgYHtyfQoKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAic2lnLnYxci5jb2V4cHJlc3MiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjFyLmNpcmNvcy5iZWQiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjFyLmJlZDEiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjFyLmJlZDIiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAic2lnLnYyci5jb2V4cHJlc3MiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjJyLmNpcmNvcy5iZWQiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjJyLmJlZDEiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAidjJyLmJlZDIiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAic2lnLmludGVyY2xhc3MuY29leHByZXNzIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgImludGVyY2xhc3MuY2lyY29zLmJlZCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJpbnRlcmNsYXNzLmJlZDEiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAiaW50ZXJjbGFzcy5iZWQyIikpCgpgYGAKCmBgYHtyfQoKdjFyLnNlY3RvcnMgPC0gbGFwcGx5KHVuaXF1ZSh2MXIuY2lyY29zLmJlZCRjaHIpLCBmdW5jdGlvbihjaHIpewogIHBhZGRpbmcgPC0gMTAwMDAwCiAgc2VjdG9yLnN0YXJ0IDwtIG1pbih2MXIuY2lyY29zLmJlZFt2MXIuY2lyY29zLmJlZCRjaHIgPT0gY2hyLCAic3RhcnQiXSkgLSBwYWRkaW5nCiAgc2VjdG9yLmVuZCA8LSBtYXgodjFyLmNpcmNvcy5iZWRbdjFyLmNpcmNvcy5iZWQkY2hyID09IGNociwgImVuZCJdKSArIHBhZGRpbmcKICByZXR1cm4oYyhjaHIsc2VjdG9yLnN0YXJ0LHNlY3Rvci5lbmQpKQp9KQoKdjFyLmNoci5jb29yZCA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIHYxci5zZWN0b3JzKSkKY29sbmFtZXModjFyLmNoci5jb29yZCkgPC0gYygiY2hyIiwic3RhcnQiLCJlbmQiKQoKbWFqb3IudGl4IDwtIHNlcShmcm9tPTAsdG89MjUwMDAwMDAwLGJ5PTEwMDAwMCkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD00MCxmaWcuaGVpZ2h0PTQwfQoKZm9udC5zY2FsZSA8LSA3CgpjaXJjb3MucGFyKHN0YXJ0LmRlZ3JlZT05MCwgZ2FwLmRlZ3JlZT0yLCB0cmFjay5tYXJnaW49YygwLjAwMDUsMC4wMDA1KSkKY2lyY29zLmdlbm9taWNJbml0aWFsaXplKHYxci5jaHIuY29vcmQscGxvdFR5cGUgPSBOVUxMKQojIEFkZCB0aGUgZ2VuZVN5bWJvbCBsYWJlbHMKY2lyY29zLmdlbm9taWNMYWJlbHModjFyLmNpcmNvcy5iZWQsIGxhYmVscy5jb2x1bW49NCwgc2lkZT0ib3V0c2lkZSIsIGxhYmVsc19oZWlnaHQ9MC4yOSwgY2V4PWZvbnQuc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc9MC4wNCwgY29ubmVjdGlvbl9oZWlnaHQ9bW1faCgxNSksIGxpbmVfbHdkPTUpCgojIERyYXcgdGhlIHNlY3RvcnMgYW5kIGFkZCBjaHIgSUQgYXMgdGV4dApjaXJjb3MudHJhY2soeWxpbT1jKDAsMSksIHBhbmVsLmZ1bj1mdW5jdGlvbih4LHkpewogIGNocj1DRUxMX01FVEEkc2VjdG9yLmluZGV4CiAgeGxpbT1DRUxMX01FVEEkeGxpbQogIHlsaW09Q0VMTF9NRVRBJHlsaW0KICBjaXJjb3MucmVjdCh4bGltWzFdLCAwLCB4bGltWzJdLCAxLCBjb2w9ImRhcmtyZWQiKQogIGNpcmNvcy50ZXh0KG1lYW4oeGxpbSksIG1lYW4oeWxpbSksIGNociwgY2V4PWZvbnQuc2NhbGUsIGNvbD0id2hpdGUiLCBmYWNpbmc9ImNsb2Nrd2lzZSIsIG5pY2VGYWNpbmc9VFJVRSkKICBjaXJjb3MueGF4aXMoaD0xLCBsYWJlbHM9RkFMU0UsIGRpcmVjdGlvbj0ib3V0c2lkZSIsIG1pbm9yLnRpY2tzPTEsCiAgICAgICAgICAgICAgIG1ham9yLnRpY2subGVuZ3RoPTAuMDUsIG1ham9yLmF0PW1ham9yLnRpeCwgbHdkPTUpCiAgfSwgdHJhY2suaGVpZ2h0PTAuMjIsIGJnLmJvcmRlcj1OQSkKY2lyY29zLmdlbm9taWNMaW5rKHYxci5iZWQxLCB2MXIuYmVkMiwgY29sPXNpZy52MXIuY29leHByZXNzJGNvbG9yLCBsd2Q9NSwgYm9yZGVyPU5BKQoKYGBgCgpgYGB7cn0KCnYyci5zZWN0b3JzIDwtIGxhcHBseSh1bmlxdWUodjJyLmNpcmNvcy5iZWQkY2hyKSwgZnVuY3Rpb24oY2hyKXsKICBwYWRkaW5nIDwtIDEwMDAwMAogIHNlY3Rvci5zdGFydCA8LSBtaW4odjJyLmNpcmNvcy5iZWRbdjJyLmNpcmNvcy5iZWQkY2hyID09IGNociwgInN0YXJ0Il0pIC0gcGFkZGluZwogIHNlY3Rvci5lbmQgPC0gbWF4KHYyci5jaXJjb3MuYmVkW3Yyci5jaXJjb3MuYmVkJGNociA9PSBjaHIsICJlbmQiXSkgKyBwYWRkaW5nCiAgcmV0dXJuKGMoY2hyLHNlY3Rvci5zdGFydCxzZWN0b3IuZW5kKSkKfSkKCnYyci5jaHIuY29vcmQgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCB2MnIuc2VjdG9ycykpCmNvbG5hbWVzKHYyci5jaHIuY29vcmQpIDwtIGMoImNociIsInN0YXJ0IiwiZW5kIikKCmNvbHMubnVtIDwtIGMoInN0YXJ0IiwiZW5kIikKdjJyLmNoci5jb29yZFtjb2xzLm51bV0gPC0gc2FwcGx5KHYyci5jaHIuY29vcmRbY29scy5udW1dLGFzLm51bWVyaWMpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NTAsZmlnLmhlaWdodD01MH0KCmZvbnQuc2NhbGUgPC0gNwoKY2lyY29zLnBhcihzdGFydC5kZWdyZWU9OTAsIGdhcC5kZWdyZWU9MiwgdHJhY2subWFyZ2luPWMoMC4wMDA1LDAuMDAwNSkpCmNpcmNvcy5nZW5vbWljSW5pdGlhbGl6ZSh2MnIuY2hyLmNvb3JkLHBsb3RUeXBlID0gTlVMTCkKIyBBZGQgdGhlIGdlbmVTeW1ib2wgbGFiZWxzCmNpcmNvcy5nZW5vbWljTGFiZWxzKHYyci5jaXJjb3MuYmVkLCBsYWJlbHMuY29sdW1uPTQsIHNpZGU9Im91dHNpZGUiLCBsYWJlbHNfaGVpZ2h0PTAuMjksIGNleD1mb250LnNjYWxlLAogICAgICAgICAgICAgICAgICAgICBwYWRkaW5nPTAuMDQsIGNvbm5lY3Rpb25faGVpZ2h0PW1tX2goMTUpLCBsaW5lX2x3ZD01KQoKIyBEcmF3IHRoZSBzZWN0b3JzIGFuZCBhZGQgY2hyIElEIGFzIHRleHQKY2lyY29zLnRyYWNrKHlsaW09YygwLDEpLCBwYW5lbC5mdW49ZnVuY3Rpb24oeCx5KXsKICBjaHI9Q0VMTF9NRVRBJHNlY3Rvci5pbmRleAogIHhsaW09Q0VMTF9NRVRBJHhsaW0KICB5bGltPUNFTExfTUVUQSR5bGltCiAgY2lyY29zLnJlY3QoeGxpbVsxXSwgMCwgeGxpbVsyXSwgMSwgY29sPSJkYXJrYmx1ZSIpCiAgY2lyY29zLnRleHQobWVhbih4bGltKSwgbWVhbih5bGltKSwgY2hyLCBjZXg9Zm9udC5zY2FsZSwgY29sPSJ3aGl0ZSIsIGZhY2luZz0iY2xvY2t3aXNlIiwgbmljZUZhY2luZz1UUlVFKQogIGNpcmNvcy54YXhpcyhoPTEsIGxhYmVscz1GQUxTRSwgZGlyZWN0aW9uPSJvdXRzaWRlIiwgbWlub3IudGlja3M9MSwKICAgICAgICAgICAgICAgbWFqb3IudGljay5sZW5ndGg9MC4wNSwgbWFqb3IuYXQ9bWFqb3IudGl4LCBsd2Q9NSkKICB9LCB0cmFjay5oZWlnaHQ9MC4yMiwgYmcuYm9yZGVyPU5BKQpjaXJjb3MuZ2Vub21pY0xpbmsodjJyLmJlZDEsIHYyci5iZWQyLCBjb2w9c2lnLnYyci5jb2V4cHJlc3MkY29sb3IsIGx3ZD01LCBib3JkZXI9TkEpCgpgYGAKCmBgYHtyfQoKaW50ZXJjbGFzcy5zZWN0b3JzIDwtIGxhcHBseSh1bmlxdWUoaW50ZXJjbGFzcy5jaXJjb3MuYmVkJGNociksIGZ1bmN0aW9uKGNocil7CiAgcGFkZGluZyA8LSAxMDAwMDAKICBzZWN0b3Iuc3RhcnQgPC0gbWluKGludGVyY2xhc3MuY2lyY29zLmJlZFtpbnRlcmNsYXNzLmNpcmNvcy5iZWQkY2hyID09IGNociwgInN0YXJ0Il0pIC0gcGFkZGluZwogIHNlY3Rvci5lbmQgPC0gbWF4KGludGVyY2xhc3MuY2lyY29zLmJlZFtpbnRlcmNsYXNzLmNpcmNvcy5iZWQkY2hyID09IGNociwgImVuZCJdKSArIHBhZGRpbmcKICByZXR1cm4oYyhjaHIsc2VjdG9yLnN0YXJ0LHNlY3Rvci5lbmQpKQp9KQoKaW50ZXJjbGFzcy5jaHIuY29vcmQgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCBpbnRlcmNsYXNzLnNlY3RvcnMpKQpjb2xuYW1lcyhpbnRlcmNsYXNzLmNoci5jb29yZCkgPC0gYygiY2hyIiwic3RhcnQiLCJlbmQiKQoKbWFqb3IudGl4IDwtIHNlcShmcm9tPTAsdG89MjUwMDAwMDAwLGJ5PTEwMDAwMCkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD01MCxmaWcuaGVpZ2h0PTUwfQoKZm9udC5zY2FsZSA8LSA3CgpjaXJjb3MucGFyKHN0YXJ0LmRlZ3JlZT05MCwgZ2FwLmRlZ3JlZT0yLCB0cmFjay5tYXJnaW49YygwLjAwMDUsMC4wMDA1KSkKY2lyY29zLmdlbm9taWNJbml0aWFsaXplKGludGVyY2xhc3MuY2hyLmNvb3JkLHBsb3RUeXBlID0gTlVMTCkKIyBBZGQgdGhlIGdlbmVTeW1ib2wgbGFiZWxzCmNpcmNvcy5nZW5vbWljTGFiZWxzKGludGVyY2xhc3MuY2lyY29zLmJlZCwgbGFiZWxzLmNvbHVtbj00LCBzaWRlPSJvdXRzaWRlIiwgbGFiZWxzX2hlaWdodD0wLjI5LCBjZXg9Zm9udC5zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgcGFkZGluZz0wLjA0LCBjb25uZWN0aW9uX2hlaWdodD1tbV9oKDE1KSwgbGluZV9sd2Q9NSkKCiMgRHJhdyB0aGUgc2VjdG9ycyBhbmQgYWRkIGNociBJRCBhcyB0ZXh0CmNpcmNvcy50cmFjayh5bGltPWMoMCwxKSwgcGFuZWwuZnVuPWZ1bmN0aW9uKHgseSl7CiAgY2hyPUNFTExfTUVUQSRzZWN0b3IuaW5kZXgKICB4bGltPUNFTExfTUVUQSR4bGltCiAgeWxpbT1DRUxMX01FVEEkeWxpbQogIGNpcmNvcy5yZWN0KHhsaW1bMV0sIDAsIHhsaW1bMl0sIDEsIGNvbD0iZGFya2dyZWVuIikKICBjaXJjb3MudGV4dChtZWFuKHhsaW0pLCBtZWFuKHlsaW0pLCBjaHIsIGNleD1mb250LnNjYWxlLCBjb2w9IndoaXRlIiwgZmFjaW5nPSJjbG9ja3dpc2UiLCBuaWNlRmFjaW5nPVRSVUUpCiAgY2lyY29zLnhheGlzKGg9MSwgbGFiZWxzPUZBTFNFLCBkaXJlY3Rpb249Im91dHNpZGUiLCBtaW5vci50aWNrcz0xLAogICAgICAgICAgICAgICBtYWpvci50aWNrLmxlbmd0aD0wLjA1LCBtYWpvci5hdD1tYWpvci50aXgsIGx3ZD01KQogIH0sIHRyYWNrLmhlaWdodD0wLjIyLCBiZy5ib3JkZXI9TkEpCmNpcmNvcy5nZW5vbWljTGluayhpbnRlcmNsYXNzLmJlZDEsIGludGVyY2xhc3MuYmVkMiwgY29sPXNpZy5pbnRlcmNsYXNzLmNvZXhwcmVzcyRjb2xvciwgbHdkPTUsIGJvcmRlcj1OQSkKCmBgYAoK